#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
#include "JeuNcurses.h"
#include "JeuSdl.h"
#include "Jeu.h"

//pour copier un fichier dans un autre
int copier_fichier(char const * const source, char const * const destination)
{
    FILE* fSrc;
    FILE* fDest;
    char buffer[512];
    int NbLus;

    if ((fSrc = fopen(source, "rb")) == NULL)
    {
        return 1;
    }

    if ((fDest = fopen(destination, "wb")) == NULL)
    {
        fclose(fSrc);
        return 2;
    }

    while ((NbLus = fread(buffer, 1, 512, fSrc)) != 0)
        fwrite(buffer, 1, NbLus, fDest);

    fclose(fDest);
    fclose(fSrc);

    return 0;
}
//Ajoute le score dans le fichier classement.txt, nom le nom du joueur, scoreAjoute est le score à ajouter
void ajouteScore(int scoreAjoute, char nom[10])
{
    char ligne[40];
    int hautScore;
    int i = 0;
    int compteur=0;
    FILE *f1;
    FILE *f2;
    FILE *f3;
    copier_fichier("classement.txt", "temporary.txt");
    copier_fichier("classement.txt", "temporary2.txt");
    f1 = fopen("classement.txt","r+");
    f2 = fopen("temporary.txt","r+");
    f3 = fopen("temporary2.txt","r+");
    if (f1 != NULL)
    {
        fscanf(f1, "%s \n", ligne);//pour ce débarasser de "classement"
        fscanf(f2, "%s \n", ligne);//pour ce débarasser de "classement"
        fscanf(f3, "%s \n", ligne);//pour ce débarasser de "classement"
        while (i<10)
        {
            fscanf(f2, "%s : %d\n", ligne, &hautScore);
            if(scoreAjoute>= hautScore)
            {
                    fprintf(f1, "%s : %d\n", nom, scoreAjoute);
                    while(compteur<i)
                    {
                        fscanf(f3, "%s : %d\n", ligne, &hautScore);
                        //fprintf(f1, "%s : %d\n", ligne, hautScore);
                        compteur++;
                        //i++;
                    }
                    while(compteur <10)
                    {
                        fscanf(f3, "%s : %d\n", ligne, &hautScore);
                        fprintf(f1, "%s : %d\n", ligne, hautScore);
                        compteur++;
                        i++;
                    }
            }
            fscanf(f1, "%s : %d\n", ligne, &hautScore);
            i++;
        }
    }
    else
    {
        printf("Impossible d'ouvrir le fichier classement.txt");
    }
    fclose(f1);
    fclose(f2);
    fclose(f3);
}

//affichage de la regle en sdl
void afficheregle()
{
    SDL_Surface *ecran = NULL, *imageDeFond = NULL;
    SDL_Rect positionFond;
    SDL_Event event;
    int continuer=1;

    positionFond.x = 0;
    positionFond.y = 0;

    SDL_Init(SDL_INIT_VIDEO);

    ecran = SDL_SetVideoMode(670, 400, 32, SDL_HWSURFACE);
    SDL_WM_SetCaption("Shoot Project", NULL);

    /* Chargement d'une image Bitmap dans une surface */
    imageDeFond = SDL_LoadBMP("regle.bmp");
    /* On blitte par-dessus l'écran */
    SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
    while(continuer==1)
    {
        SDL_Flip(ecran);
        //pause();
        SDL_WaitEvent(&event);
        if(event.type==SDL_QUIT || event.key.keysym.sym==SDLK_ESCAPE)
        {
                continuer = 0;
        }
   }

    SDL_FreeSurface(imageDeFond); /* On libère la surface */
    SDL_Quit();

}


//un affichage de menu basique
int menuAff()
{
    int choix;
        printf("\nMenu\n");
        printf("1 : Jouer\n");
        printf("2 : Classement\n");
        printf("3 : Règle\n");
        //printf("0 : Exit\n");
        printf("Votre choix?\n");
        scanf("%d",&choix);
    return choix;
}

//affichage du menu en Ncurses
void menuNcurses()
{
    Jeu jeu;
    int score;
    char ligne[40];
    char nom[10];
    FILE *f1;
    FILE *f2;

    printf("choisissez un nom \n");
    scanf("%s", nom);
    int choix=menuAff();
    switch (choix)
    {
        case 1:
        jeuInit(&jeu);
        score = ncursBoucle(&jeu);
        break;

        case 2:
        f1 = fopen("classement.txt","r");
        while (!feof(f1))
        {
            fscanf(f1, "%s\n", ligne);
            printf("%s\n", ligne);
        }
        fclose(f1);
        break;

        case 3:
        f2 = fopen("regle.txt","r");
        while (!feof(f2))
        {
            fscanf(f2, "%s\n", ligne);
            printf("%s ", ligne);
        }
        printf("\n");
        fclose(f2);
        break;
	}
        ajouteScore(score, nom);
}

//affichage du menu en SDL
void menuSdl()
{
    SDL_Surface *ecran = NULL, *menu = NULL, *cadre = NULL;
    SDL_Rect positionMenu, positionCadre;
    SDL_Event event;
    sdlJeu sj;

    if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) //Initialisation de l'API Mixer
    {
      printf("%s", Mix_GetError());
    }
    /** pour la musique **/
    Mix_VolumeMusic(MIX_MAX_VOLUME / 2); //Mettre le volume à la moitié
    Mix_Music *musique; //Création d'un pointeur de type Mix_Music
    musique = Mix_LoadMUS("Menu.mp3"); //Chargement de la musique
    Mix_PlayMusic(musique, -1); //Jouer infiniment la musique

    /** pour les bruitage **/
    Mix_AllocateChannels(32); //Allouer 32 canaux
    Mix_Volume(1, MIX_MAX_VOLUME/2); //Mettre à mi-volume le post 1
    Mix_Chunk *son, *son2;//Créer un pointeur pour stocker un son
    son = Mix_LoadWAV("Son_Menu.ogg"); //Charger un wav dans un pointeur
    son2 = Mix_LoadWAV("Select.wav");
    Mix_VolumeChunk(son, MIX_MAX_VOLUME/2); //Mettre un volume pour ce wav
    Mix_VolumeChunk(son2, MIX_MAX_VOLUME/2);

    int continuer =1;//indique que le jeu est en cours

    SDL_Init(SDL_INIT_VIDEO);
    ecran = SDL_SetVideoMode(800, 531, 32, SDL_HWSURFACE );
    SDL_WM_SetCaption("Shoot Project", NULL);

    cadre = SDL_load_image("cadre.bmp");
    SDL_SetColorKey(cadre, SDL_SRCCOLORKEY, SDL_MapRGB(ecran->format, 0, 255, 0));//pour la transparence du vert
    positionCadre.x = 0;
    positionCadre.y = 48;

    menu =IMG_Load("Menu.bmp");
    positionMenu.x = 0;
    positionMenu.y = 0;

    while(continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_UP:
                        if(positionCadre.y>48)
                        {
                            positionCadre.y-=87;
                            Mix_PlayChannel(1, son, 0);//Joue le son 1 sur le canal 1 ; le joue une fois (0 + 1)
                        }
                        break;
                    case SDLK_DOWN:
                        if(positionCadre.y<222)
                        {
                            positionCadre.y+=87;
                            Mix_PlayChannel(1, son, 0);
                        }
                        break;
                    case SDLK_ESCAPE://quitter
                        continuer = 0;
                        break;
                    case SDLK_RETURN://jouer
                        if(positionCadre.y==48)
                        {
                            Mix_PlayChannel(2, son2, 0);
                            Mix_HaltMusic();
                            sdljeuInit( &sj );
                            sdljeuBoucle( &sj );
                            sdljeuDetruit( &sj );
                            continuer = 0;
                        }
                        else if(positionCadre.y==135)
                        {

                        }
                        else if(positionCadre.y==222)
                        {
                            afficheregle();
                        }
                        break;
                    default :
                        break;
                }
                break;
        }
        ecran = SDL_SetVideoMode(800, 531, 32, SDL_HWSURFACE );
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
        SDL_BlitSurface(cadre, NULL, ecran, &positionCadre);
        SDL_Flip(ecran);
    }
    SDL_FreeSurface(cadre);
    SDL_FreeSurface(menu);
    Mix_FreeChunk(son);//Libération du son 1
    Mix_FreeChunk(son2);
    Mix_FreeMusic(musique); //Libération de la musique
    Mix_CloseAudio(); //Fermeture de l'API
    SDL_Quit();
}


int main()
{
//  int typeJeu = 1;//Ncurses
    int typeJeu = 2;//SDL

    if(typeJeu == 1)
    {
        menuNcurses();
    }
    else
    {
        menuSdl();
    }

    return 0;
}
